package com.bj58.mis.apm.server.kylin.util;

import com.google.gson.*;

import java.lang.reflect.Type;
import java.util.Map;

/**
 * JSON处理工具
 */
public class JsonUtil {

    /**
     * 工具
     */
    //private static final Gson gson = new GsonBuilder().registerTypeAdapter(String.class, new StringConverter()).create();
    private static final Gson gson = new Gson();

    /**
     * 将json字符串转换成Map
     * @param json 待处理字符串
     * @return
     */
    public static Map<String, Object> fromJson(String json){
        return gson.fromJson(json, Map.class);
    }

    /**
     * 将json字符串转换成对象T
     * @param json 待处理字符串
     * @param clazz 目标对象
     * @return
     */
    public static <T> T fromJson(String json, Class<T> clazz){
        return gson.fromJson(json, clazz);
    }

    /**
     * 将json对象转换成list
     * @param json
     * @param typeOfT
     * @param <T>
     * @return
     * @throws JsonIOException
     * @throws JsonSyntaxException
     */
    public static <T> T fromJson(String json, Type typeOfT) throws JsonIOException, JsonSyntaxException {
        return gson.fromJson(json, typeOfT);
    }

    /**
     * 将Object对象转换成json字符串
     * @param obj 待转对象
     * @return
     */
    public static String toString(Object obj) { return gson.toJson(obj); }

    /**
     * 扩展处理解析到为null的字符串，替换成“”
     */
    private static class StringConverter implements JsonSerializer<String>, JsonDeserializer {
        @Override
        public String deserialize(JsonElement json, Type typeOfT,
                                  JsonDeserializationContext context)
                throws JsonParseException {
            return json.getAsJsonPrimitive().getAsString();
        }

        @Override
        public JsonElement serialize(String src, Type typeOfSrc,
                                     JsonSerializationContext context) {
            if (src == null || "null".equals(src) || "NULL".equals(src)) {
                return new JsonPrimitive("");
            } else {
                return new JsonPrimitive(src.toString());
            }
        }
    }

}


